/*
 * ** Network and Service Differentiation Extensions to CloudSim 3.0 **
 *
 * Gokul Poduval & Chen-Khong Tham
 * Computer Communication Networks (CCN) Lab
 * Dept of Electrical & Computer Engineering
 * National University of Singapore
 * August 2004
 *
 * Licence: GPL - http://www.gnu.org/copyleft/gpl.html
 * Copyright (c) 2004, The University of Melbourne, Australia and National
 * University of Singapore
 * Packet.java - Interface of a Network Packet.
 *
 */

package org.cloudbus.cloudsim;

/**
 * This class contains the structure for a network packet.
 *
 * @author		Gokul Poduval
 * @author		Chen-Khong Tham, National University of Singapore
 * @since		CloudSim Toolkit 1.0
 */
public interface Packet {
    /**
     * Returns a string describing this packet in detail.
     * @return description of this packet
     * @pre $none
     * @post $none
     */
    @Override
	String toString();

    /**
     * Returns the size of this packet
     * @return size of the packet
     * @pre $none
     * @post $none
     */
    long getSize();

    /**
     * Sets the size of this packet
     * @param size  size of the packet
     * @return <tt>true</tt> if it is successful, <tt>false</tt> otherwise
     * @pre size >= 0
     * @post $none
     */
    boolean setSize(long size);

    /**
     * Returns the destination id of this packet.
     * @return destination id
     * @pre $none
     * @post $none
     */
    int getDestId();

    /**
     * Returns the ID of this packet
     * @return packet ID
     * @pre $none
     * @post $none
     */
    int getId();

    /**
     * Returns the ID of the source of this packet.
     * @return source id
     * @pre $none
     * @post $none
     */
    int getSrcId();

    /**
     * Gets the network service type of this packet
     * @return the network service type
     * @pre $none
     * @post $none
     */
    int getNetServiceType();

    /**
     * Sets the network service type of this packet.
     * <p>
     * By default, the service type is 0 (zero). It is depends on the packet
     * scheduler to determine the priority of this service level.
     * @param serviceType   this packet's service type
     * @pre serviceType >= 0
     * @post $none
     */
    void setNetServiceType(int serviceType);

    /**
     * Gets an entity ID from the last hop that this packet has traversed.
     * @return an entity ID
     * @pre $none
     * @post $none
     */
    int getLast();

    /**
     * Sets an entity ID from the last hop that this packet has traversed.
     * @param last  an entity ID from the last hop
     * @pre last > 0
     * @post $none
     */
    void setLast(int last);

    /**
     * Gets this packet tag
     * @return this packet tag
     * @pre $none
     * @post $none
     */
    int getTag();

}
